using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using database;
using objetos;

namespace dados
{
	#region TB_PRODUTO
	/// <summary>
	/// This object represents the properties and methods of a TB_PRODUTO.
	/// </summary>
	public class DAL_TB_PRODUTO
	{		
	
		/// <summary>
		/// Incluir via aplicacao
		/// </summary>	
		public int Incluir(OBJ_TB_PRODUTO obj)
		{
			try
			{
				DAO_DATABASE db = new DAO_DATABASE();
				DataSet ds = new DataSet();
				List<string> lista = new List<string>();		
	
				db.CreateParameter("@id_marca", SqlDbType.Int, obj.id_marca);				
				lista.Add("@id_marca");				
				db.CreateParameter("@id_grupo", SqlDbType.Int, obj.id_grupo);				
				lista.Add("@id_grupo");				
				db.CreateParameter("@id_categoria", SqlDbType.Int, obj.id_categoria);				
				lista.Add("@id_categoria");				
				db.CreateParameter("@id_ncm", SqlDbType.Int, obj.id_ncm);				
				lista.Add("@id_ncm");				
				db.CreateParameter("@extipi", SqlDbType.Int, obj.extipi);				
				lista.Add("@extipi");				
				db.CreateParameter("@id_genero_produto_servico", SqlDbType.Int, obj.id_genero_produto_servico);				
				lista.Add("@id_genero_produto_servico");										
				db.CreateParameter("@id_tipo_item", SqlDbType.Int, obj.id_tipo_item);				
				lista.Add("@id_tipo_item");				
				db.CreateParameter("@id_tipo_producao", SqlDbType.Int, obj.id_tipo_producao);				
				lista.Add("@id_tipo_producao");				
				db.CreateParameter("@ean", SqlDbType.VarChar, obj.ean);				
				lista.Add("@ean");
                db.CreateParameter("@cfop", SqlDbType.Int, obj.cfop);
                lista.Add("@cfop");	
				db.CreateParameter("@descricao", SqlDbType.VarChar, obj.descricao);				
				lista.Add("@descricao");				
				db.CreateParameter("@qtd_inicial", SqlDbType.Decimal, obj.qtd_inicial);				
				lista.Add("@qtd_inicial");				
				db.CreateParameter("@valor_promocao", SqlDbType.Decimal, obj.valor_promocao);				
				lista.Add("@valor_promocao");				
				db.CreateParameter("@valor_custo", SqlDbType.Decimal, obj.valor_custo);				
				lista.Add("@valor_custo");				
				db.CreateParameter("@valor_margem_lucro", SqlDbType.Decimal, obj.valor_margem_lucro);				
				lista.Add("@valor_margem_lucro");				
				db.CreateParameter("@valor_venda", SqlDbType.Decimal, obj.valor_venda);				
				lista.Add("@valor_venda");				
				db.CreateParameter("@valor_custo_medio", SqlDbType.Decimal, obj.valor_custo_medio);				
				lista.Add("@valor_custo_medio");				
				db.CreateParameter("@id_unidade_medida", SqlDbType.Int, obj.id_unidade_medida);				
				lista.Add("@id_unidade_medida");				
				db.CreateParameter("@id_estoque_local", SqlDbType.Int, obj.id_estoque_local);				
				lista.Add("@id_estoque_local");				
				db.CreateParameter("@id_servico_issqn", SqlDbType.Int, obj.id_servico_issqn);				
				lista.Add("@id_servico_issqn");				
				db.CreateParameter("@sit_ativo", SqlDbType.Bit, obj.sit_ativo);				
				lista.Add("@sit_ativo");				
				db.CreateParameter("@dt_cadastro", SqlDbType.DateTime, obj.dt_cadastro);				
				lista.Add("@dt_cadastro");				
				db.CreateParameter("@sit_mov_estoque", SqlDbType.Bit, obj.sit_mov_estoque);				
				lista.Add("@sit_mov_estoque");				
				db.CreateParameter("@id_usuario_checkin", SqlDbType.Int, obj.id_usuario_checkin);				
				lista.Add("@id_usuario_checkin");				
				db.CreateParameter("@dt_checkin", SqlDbType.DateTime, obj.dt_checkin);				
				lista.Add("@dt_checkin");				
	
				string query = String.Format("Insert Into tb_produto ({0}) Values ({1}); SELECT SCOPE_IDENTITY()",  string.Join(",",lista.ToArray()).ToString().Replace("@", ""), string.Join(",",lista.ToArray()).ToString());
				ds = db.ExecuteQuery(query);
				
				return Convert.ToInt32(ds.Tables[0].Rows[0][0].ToString());
			}
			catch (Exception)
       		{
            	throw;
        	}
		}
		
		/// <summary>
		/// Update via aplicacao
		/// </summary>			
		public void Alterar(OBJ_TB_PRODUTO obj)
		{
			try
			{
				DAO_DATABASE db = new DAO_DATABASE();
				List<string> lista = new List<string>();
	
				db.CreateParameter("@id", SqlDbType.Int, obj.id);
				
	
				db.CreateParameter("@id_marca", SqlDbType.Int, obj.id_marca);
				lista.Add("id_marca = @id_marca");
				db.CreateParameter("@id_grupo", SqlDbType.Int, obj.id_grupo);
				lista.Add("id_grupo = @id_grupo");
				db.CreateParameter("@id_categoria", SqlDbType.Int, obj.id_categoria);
				lista.Add("id_categoria = @id_categoria");
				db.CreateParameter("@id_ncm", SqlDbType.Int, obj.id_ncm);
				lista.Add("id_ncm = @id_ncm");
				db.CreateParameter("@extipi", SqlDbType.Int, obj.extipi);
				lista.Add("extipi = @extipi");
				db.CreateParameter("@id_genero_produto_servico", SqlDbType.Int, obj.id_genero_produto_servico);
				lista.Add("id_genero_produto_servico = @id_genero_produto_servico");				
				db.CreateParameter("@id_tipo_item", SqlDbType.Int, obj.id_tipo_item);
				lista.Add("id_tipo_item = @id_tipo_item");
				db.CreateParameter("@id_tipo_producao", SqlDbType.Int, obj.id_tipo_producao);
				lista.Add("id_tipo_producao = @id_tipo_producao");
				db.CreateParameter("@ean", SqlDbType.Int, obj.ean);
				lista.Add("ean = @ean");
                db.CreateParameter("@cfop", SqlDbType.Int, obj.cfop);
                lista.Add("cfop = @cfop");
				db.CreateParameter("@descricao", SqlDbType.VarChar, obj.descricao);
				lista.Add("descricao = @descricao");
				db.CreateParameter("@qtd_inicial", SqlDbType.Decimal, obj.qtd_inicial);
				lista.Add("qtd_inicial = @qtd_inicial");
				db.CreateParameter("@valor_promocao", SqlDbType.Decimal, obj.valor_promocao);
				lista.Add("valor_promocao = @valor_promocao");
				db.CreateParameter("@valor_custo", SqlDbType.Decimal, obj.valor_custo);
				lista.Add("valor_custo = @valor_custo");
				db.CreateParameter("@valor_margem_lucro", SqlDbType.Decimal, obj.valor_margem_lucro);
				lista.Add("valor_margem_lucro = @valor_margem_lucro");
				db.CreateParameter("@valor_venda", SqlDbType.Decimal, obj.valor_venda);
				lista.Add("valor_venda = @valor_venda");
				db.CreateParameter("@valor_custo_medio", SqlDbType.Decimal, obj.valor_custo_medio);
				lista.Add("valor_custo_medio = @valor_custo_medio");
				db.CreateParameter("@id_unidade_medida", SqlDbType.Int, obj.id_unidade_medida);
				lista.Add("id_unidade_medida = @id_unidade_medida");
				db.CreateParameter("@id_estoque_local", SqlDbType.Int, obj.id_estoque_local);
				lista.Add("id_estoque_local = @id_estoque_local");
				db.CreateParameter("@id_servico_issqn", SqlDbType.Int, obj.id_servico_issqn);
				lista.Add("id_servico_issqn = @id_servico_issqn");
				db.CreateParameter("@sit_ativo", SqlDbType.Bit, obj.sit_ativo);
				lista.Add("sit_ativo = @sit_ativo");
				db.CreateParameter("@dt_cadastro", SqlDbType.DateTime, obj.dt_cadastro);
				lista.Add("dt_cadastro = @dt_cadastro");
				db.CreateParameter("@sit_mov_estoque", SqlDbType.Bit, obj.sit_mov_estoque);
				lista.Add("sit_mov_estoque = @sit_mov_estoque");
				db.CreateParameter("@id_usuario_checkin", SqlDbType.Int, obj.id_usuario_checkin);
				lista.Add("id_usuario_checkin = @id_usuario_checkin");
				db.CreateParameter("@dt_checkin", SqlDbType.DateTime, obj.dt_checkin);
				lista.Add("dt_checkin = @dt_checkin");
	
				string query = String.Format("Update TB_PRODUTO Set {0} Where id = @id", string.Join(",",lista.ToArray()).ToString());
				db.ExecuteQuery(query);
			}
			catch (Exception)
       		{
            	throw;
        	}
		}	
		
		/// <summary>
		/// Delete viaaplicacao
		/// </summary>	
		public void Excluir(OBJ_TB_PRODUTO obj)
		{
			try
			{
				DAO_DATABASE db = new DAO_DATABASE();
				StringBuilder queryParameters = new StringBuilder();
				db.CreateParameter("@id", SqlDbType.Int, obj.id);
		
				string query = "Delete tb_produto Where id = @id";			
				db.ExecuteQuery(query);
			}
			catch (Exception)
       		{
            	throw;
        	}
		}
	
	
		/// <summary>
		/// Lista objeto
		/// </summary>						
		public List<OBJ_TB_PRODUTO> SelecionarLista()
    	{
        	try
        	{
				DAO_DATABASE db = new DAO_DATABASE();
				List<OBJ_TB_PRODUTO> lista = new List<OBJ_TB_PRODUTO>();
				OBJ_TB_PRODUTO obj = null;
				DataTable dt = new DataTable();
				DataSet ds = new DataSet();
				StringBuilder sb = new StringBuilder();
                sb.Append("SELECT     tb_produto.id, tb_produto.id_marca, tb_produto.id_grupo, tb_produto.id_categoria, tb_produto.id_ncm, tb_produto.extipi, tb_produto.cfop, tb_produto.id_genero_produto_servico, ");
                sb.Append("                       tb_produto.id_tipo_item, tb_produto.id_tipo_producao, tb_produto.ean, tb_produto.descricao, tb_produto.qtd_inicial, ");
                sb.Append("                      tb_produto.valor_promocao, tb_produto.valor_custo, tb_produto.valor_margem_lucro, tb_produto.valor_venda, tb_produto.valor_custo_medio, ");
                sb.Append(" tb_produto.id_unidade_medida, tb_produto.id_estoque_local, tb_produto.id_servico_issqn, tb_produto.dt_cadastro, tb_produto.sit_ativo, tb_produto.sit_mov_estoque, ");
                sb.Append(" tb_produto.id_usuario_checkin, tb_produto.dt_checkin, tb_tipo_item.desc_tipo_item, tb_tipo_producao.desc_tipo_producao, tb_produto_marca.marca, ");
                sb.Append(" tb_produto_categoria.categoria, tb_produto_detalhe.peso_bruto, tb_produto_detalhe.peso_liquido, tb_produto_detalhe.largura, tb_produto_detalhe.altura, ");
                sb.Append(" tb_produto_detalhe.profundidade, tb_produto_detalhe.volume, tb_produto_detalhe.id_cor, tb_produto_detalhe.id_tipo_compartimento, tb_ncm.desc_ncm, ");
                sb.Append(" tb_ncm.unidade_medida, (SELECT  ISNULL(SUM(qtd_entrada) - SUM(qtd_saida),0) FROM tb_estoque_movimento as e where e.id_produto = tb_produto.id) as qtd_estoque");
                sb.Append(" FROM         tb_produto INNER JOIN ");
                sb.Append("           tb_produto_categoria ON tb_produto.id_categoria = tb_produto_categoria.id LEFT JOIN");
                sb.Append(" tb_produto_detalhe ON tb_produto.id = tb_produto_detalhe.id_produto INNER JOIN");
                sb.Append(" tb_produto_marca ON tb_produto.id_marca = tb_produto_marca.id INNER JOIN");
                sb.Append(" tb_tipo_item ON tb_produto.id_tipo_item = tb_tipo_item.id INNER JOIN");
                sb.Append(" tb_tipo_producao ON tb_produto.id_tipo_producao = tb_tipo_producao.id INNER JOIN");
                sb.Append(" tb_ncm ON tb_produto.id_ncm = tb_ncm.id");
        
	            ds = db.ExecuteQuery(sb.ToString());
				
				if(!db.DataSetIsEmpty(ds))
				{
					dt = ds.Tables[0];
					
					foreach (DataRow dr in dt.Rows)
					{											
						obj = new OBJ_TB_PRODUTO();
						Set(obj,dr);
						lista.Add(obj);
		
					}
				}
				return lista;
        	}
        	catch (Exception)
       		{
            	throw;
        	}

    	}
		
		/// <summary>
		/// Set Objeto
		/// </summary>	
		private void Set(OBJ_TB_PRODUTO obj,DataRow dr)
		{
			obj.id = Convert.ToInt32(dr["id"]);						
			obj.id_marca = Convert.ToInt32(dr["id_marca"].ToString()) ;	
			obj.id_grupo = Convert.ToInt32(dr["id_grupo"].ToString()) ;	
			obj.id_categoria = Convert.ToInt32(dr["id_categoria"].ToString()) ;	
			obj.id_ncm = Convert.ToInt32(dr["id_ncm"].ToString()) ;	
			obj.extipi =  dr["extipi"] == DBNull.Value ? (int?)null : Convert.ToInt32(dr["extipi"].ToString()) ;	
			obj.id_genero_produto_servico = Convert.ToInt32(dr["id_genero_produto_servico"].ToString()) ;				
			obj.id_tipo_item = Convert.ToInt32(dr["id_tipo_item"].ToString()) ;	
			obj.id_tipo_producao = Convert.ToInt32(dr["id_tipo_producao"].ToString()) ;	
			obj.ean = dr["ean"].ToString() ;	
			obj.descricao = dr["descricao"] == DBNull.Value ?  string.Empty : dr["descricao"].ToString() ;
			obj.qtd_inicial = dr["qtd_inicial"] == DBNull.Value ?  0 : Convert.ToDecimal(dr["qtd_inicial"].ToString()) ;
			obj.valor_promocao = dr["valor_promocao"] == DBNull.Value ?  0 : Convert.ToDecimal(dr["valor_promocao"].ToString()) ;
			obj.valor_custo = dr["valor_custo"] == DBNull.Value ?  0 : Convert.ToDecimal(dr["valor_custo"].ToString()) ;
			obj.valor_margem_lucro = dr["valor_margem_lucro"] == DBNull.Value ?  0 : Convert.ToDecimal(dr["valor_margem_lucro"].ToString()) ;
			obj.valor_venda = dr["valor_venda"] == DBNull.Value ?  0 : Convert.ToDecimal(dr["valor_venda"].ToString()) ;
			obj.valor_custo_medio = dr["valor_custo_medio"] == DBNull.Value ?  0 : Convert.ToDecimal(dr["valor_custo_medio"].ToString()) ;
			obj.id_unidade_medida = Convert.ToInt32(dr["id_unidade_medida"].ToString()) ;	
			obj.id_estoque_local = dr["id_estoque_local"] == DBNull.Value ? (int?)null :  Convert.ToInt32(dr["id_estoque_local"].ToString()) ;	
			obj.id_servico_issqn = dr["id_servico_issqn"] == DBNull.Value ? (int?)null : Convert.ToInt32(dr["id_servico_issqn"].ToString()) ;	
			obj.sit_ativo = Convert.ToBoolean(dr["sit_ativo"].ToString()) ;
			obj.dt_cadastro = dr["dt_cadastro"] == DBNull.Value ? (DateTime?)null :  Convert.ToDateTime(dr["dt_cadastro"].ToString()) ;						
			obj.sit_mov_estoque = Convert.ToBoolean(dr["sit_mov_estoque"].ToString()) ;
			obj.id_usuario_checkin = dr["id_usuario_checkin"] == DBNull.Value ? (int?)null : Convert.ToInt32(dr["id_usuario_checkin"].ToString()) ;	
			obj.dt_checkin = dr["dt_checkin"] == DBNull.Value ? (DateTime?)null :  Convert.ToDateTime(dr["dt_checkin"].ToString()) ;						
			
		}						
				
		/// <summary>
		/// Selecionar Objeto Por ID
		/// </summary>	
		public OBJ_TB_PRODUTO SelecionarObjetoPorId(int id)
		{
			try
			{
				DAO_DATABASE db = new DAO_DATABASE();
				OBJ_TB_PRODUTO obj = new OBJ_TB_PRODUTO();
				DataSet ds = new DataSet();				
				DataTable dt = new DataTable();
				
				db.CreateParameter("@id", SqlDbType.Int, id);
				StringBuilder sb = new StringBuilder();
                sb.Append("SELECT     tb_produto.id, tb_produto.id_marca, tb_produto.id_grupo, tb_produto.id_categoria, tb_produto.id_ncm, tb_produto.extipi, tb_produto.cfop, tb_produto.id_genero_produto_servico, ");
                sb.Append("                       tb_produto.id_tipo_item, tb_produto.id_tipo_producao, tb_produto.ean, tb_produto.descricao, tb_produto.qtd_inicial, ");
                sb.Append("                      tb_produto.valor_promocao, tb_produto.valor_custo, tb_produto.valor_margem_lucro, tb_produto.valor_venda, tb_produto.valor_custo_medio, ");
                sb.Append(" tb_produto.id_unidade_medida, tb_produto.id_estoque_local, tb_produto.id_servico_issqn, tb_produto.dt_cadastro, tb_produto.sit_ativo, tb_produto.sit_mov_estoque, ");
                sb.Append(" tb_produto.id_usuario_checkin, tb_produto.dt_checkin, tb_tipo_item.desc_tipo_item, tb_tipo_producao.desc_tipo_producao, tb_produto_marca.marca, ");
                sb.Append(" tb_produto_categoria.categoria, tb_produto_detalhe.peso_bruto, tb_produto_detalhe.peso_liquido, tb_produto_detalhe.largura, tb_produto_detalhe.altura, ");
                sb.Append(" tb_produto_detalhe.profundidade, tb_produto_detalhe.volume, tb_produto_detalhe.id_cor, tb_produto_detalhe.id_tipo_compartimento, tb_ncm.desc_ncm, ");
                sb.Append(" tb_ncm.unidade_medida, (SELECT  ISNULL(SUM(qtd_entrada) - SUM(qtd_saida),0) FROM tb_estoque_movimento as e where e.id_produto = tb_produto.id) as qtd_estoque");
                sb.Append(" FROM         tb_produto INNER JOIN ");
                sb.Append("           tb_produto_categoria ON tb_produto.id_categoria = tb_produto_categoria.id LEFT JOIN");
                sb.Append(" tb_produto_detalhe ON tb_produto.id = tb_produto_detalhe.id_produto INNER JOIN");
                sb.Append(" tb_produto_marca ON tb_produto.id_marca = tb_produto_marca.id INNER JOIN");
                sb.Append(" tb_tipo_item ON tb_produto.id_tipo_item = tb_tipo_item.id INNER JOIN");
                sb.Append(" tb_tipo_producao ON tb_produto.id_tipo_producao = tb_tipo_producao.id INNER JOIN");
                sb.Append(" tb_ncm ON tb_produto.id_ncm = tb_ncm.id");

				sb.Append(" Where tb_produto.id = @id");
				ds = db.ExecuteQuery(sb.ToString());				
				
				if(!db.DataSetIsEmpty(ds))
				{
					dt = ds.Tables[0];
					
					foreach (DataRow dr in dt.Rows)
                	{
						obj = new OBJ_TB_PRODUTO();
						Set(obj,dr);																			
					}
					return obj;
					
				}
				else
				{
					return null;	
				}			
			}
			catch (Exception)
       		{
            	throw;
        	}
			
		}
					
		
		
		/// <summary>
		/// Lista objeto Parametro Where OrderBy
		/// </summary>							
		public List<OBJ_TB_PRODUTO> SelecionarLista(String Where, String OrderBy)
    	{
        	try
        	{
				DAO_DATABASE db = new DAO_DATABASE();
				OBJ_TB_PRODUTO obj = null;
				DataSet ds = new DataSet();
				DataTable dt = new DataTable();
				List<OBJ_TB_PRODUTO> lista = new List<OBJ_TB_PRODUTO>();
				
				StringBuilder sb = new StringBuilder();
				db.CreateParameter("@Where",SqlDbType.VarChar, Where );
				db.CreateParameter("@OrderBy", SqlDbType.VarChar, OrderBy );

                sb.Append("SELECT     tb_produto.id, tb_produto.id_marca, tb_produto.id_grupo, tb_produto.id_categoria, tb_produto.id_ncm, tb_produto.extipi, tb_produto.cfop, tb_produto.id_genero_produto_servico, ");
                sb.Append("                       tb_produto.id_tipo_item, tb_produto.id_tipo_producao, tb_produto.ean, tb_produto.descricao, tb_produto.qtd_inicial, ");
                sb.Append("                      tb_produto.valor_promocao, tb_produto.valor_custo, tb_produto.valor_margem_lucro, tb_produto.valor_venda, tb_produto.valor_custo_medio, ");
                sb.Append(" tb_produto.id_unidade_medida, tb_produto.id_estoque_local, tb_produto.id_servico_issqn, tb_produto.dt_cadastro, tb_produto.sit_ativo, tb_produto.sit_mov_estoque, ");
                sb.Append(" tb_produto.id_usuario_checkin, tb_produto.dt_checkin, tb_tipo_item.desc_tipo_item, tb_tipo_producao.desc_tipo_producao, tb_produto_marca.marca, ");
                sb.Append(" tb_produto_categoria.categoria, tb_produto_detalhe.peso_bruto, tb_produto_detalhe.peso_liquido, tb_produto_detalhe.largura, tb_produto_detalhe.altura, ");
                sb.Append(" tb_produto_detalhe.profundidade, tb_produto_detalhe.volume, tb_produto_detalhe.id_cor, tb_produto_detalhe.id_tipo_compartimento, tb_ncm.desc_ncm, ");
                sb.Append(" tb_ncm.unidade_medida, (SELECT  ISNULL(SUM(qtd_entrada) - SUM(qtd_saida),0) FROM tb_estoque_movimento as e where e.id_produto = tb_produto.id) as qtd_estoque");
                sb.Append(" FROM         tb_produto INNER JOIN ");
                sb.Append("           tb_produto_categoria ON tb_produto.id_categoria = tb_produto_categoria.id LEFT JOIN");
                sb.Append(" tb_produto_detalhe ON tb_produto.id = tb_produto_detalhe.id_produto INNER JOIN");
                sb.Append(" tb_produto_marca ON tb_produto.id_marca = tb_produto_marca.id INNER JOIN");
                sb.Append(" tb_tipo_item ON tb_produto.id_tipo_item = tb_tipo_item.id INNER JOIN");
                sb.Append(" tb_tipo_producao ON tb_produto.id_tipo_producao = tb_tipo_producao.id INNER JOIN");
                sb.Append(" tb_ncm ON tb_produto.id_ncm = tb_ncm.id");
				if(Where != string.Empty)				
				sb.Append(string.Format(" Where {0} ",Where));
				if(OrderBy != string.Empty)
				sb.Append(string.Format(" Order by {0}",OrderBy));
				
				ds = db.ExecuteQuery(sb.ToString());
				
				if(!db.DataSetIsEmpty(ds))
				{
					dt = ds.Tables[0];
					foreach (DataRow dr in dt.Rows)
					{						
						obj = new OBJ_TB_PRODUTO();
						Set(obj,dr);			
						lista.Add(obj);
					}
				}
				return lista;
        	}
        	catch (Exception)
       		{
            	throw;
        	}

    	}

		
		public DataSet Selecionar(String Where, String OrderBy, int PageIndex, int PageSize )
		{
				DAO_DATABASE db = new DAO_DATABASE();
				DataSet ds = new DataSet();
				
				StringBuilder sb = new StringBuilder();
				
				PageIndex = PageSize * PageIndex;
            	PageSize =  PageIndex + PageSize;
				
		      	if (OrderBy == string.Empty) OrderBy = "tb_produto.id";

            	sb.Append("SELECT * FROM ");
            	sb.Append(string.Format(" (SELECT ROW_NUMBER() OVER (ORDER BY {0}) AS RowNumber,",OrderBy));
                sb.Append("  tb_produto.id, tb_produto.id_marca, tb_produto.id_grupo, tb_produto.id_categoria, tb_produto.id_ncm, tb_produto.extipi, tb_produto.cfop, tb_produto.id_genero_produto_servico, ");
                sb.Append("                       tb_produto.id_tipo_item, tb_produto.id_tipo_producao, tb_produto.ean, tb_produto.descricao, tb_produto.qtd_inicial, ");
                sb.Append("                      tb_produto.valor_promocao, tb_produto.valor_custo, tb_produto.valor_margem_lucro, tb_produto.valor_venda, tb_produto.valor_custo_medio, ");
                sb.Append(" tb_produto.id_unidade_medida, tb_produto.id_estoque_local, tb_produto.id_servico_issqn, tb_produto.dt_cadastro, tb_produto.sit_ativo, tb_produto.sit_mov_estoque, ");
                sb.Append(" tb_produto.id_usuario_checkin, tb_produto.dt_checkin, tb_tipo_item.desc_tipo_item, tb_tipo_producao.desc_tipo_producao, tb_produto_marca.marca, ");
                sb.Append(" tb_produto_categoria.categoria, tb_produto_detalhe.peso_bruto, tb_produto_detalhe.peso_liquido, tb_produto_detalhe.largura, tb_produto_detalhe.altura, ");
                sb.Append(" tb_produto_detalhe.profundidade, tb_produto_detalhe.volume, tb_produto_detalhe.id_cor, tb_produto_detalhe.id_tipo_compartimento, tb_ncm.desc_ncm, ");
                sb.Append(" tb_ncm.unidade_medida, (SELECT  ISNULL(SUM(qtd_entrada) - SUM(qtd_saida),0) FROM tb_estoque_movimento as e where e.id_produto = tb_produto.id) as qtd_estoque");
                sb.Append(" FROM         tb_produto INNER JOIN ");
                sb.Append("           tb_produto_categoria ON tb_produto.id_categoria = tb_produto_categoria.id LEFT JOIN");
                sb.Append(" tb_produto_detalhe ON tb_produto.id = tb_produto_detalhe.id_produto INNER JOIN");
                sb.Append(" tb_produto_marca ON tb_produto.id_marca = tb_produto_marca.id INNER JOIN");
                sb.Append(" tb_tipo_item ON tb_produto.id_tipo_item = tb_tipo_item.id INNER JOIN");
                sb.Append(" tb_tipo_producao ON tb_produto.id_tipo_producao = tb_tipo_producao.id INNER JOIN");
                sb.Append(" tb_ncm ON tb_produto.id_ncm = tb_ncm.id");

				if (Where != string.Empty)
				{
					sb.Append(string.Format(" WHERE {0}", Where));
				}
				sb.Append(" ) query  ");
				sb.Append(string.Format(" WHERE RowNumber BETWEEN {0} + 1 and {1}; ",PageIndex,PageSize));

            	sb.Append("SELECT count(*) FROM tb_produto");
				if (Where != string.Empty)
				{
					sb.Append(string.Format(" WHERE {0}", Where));
				}
				ds = db.ExecuteQuery(sb.ToString());
				
				if (!db.DataSetIsEmpty(ds))
            	{
                publico.PUB_PAGINACAO.CalcularTotalDePaginas(Convert.ToDecimal(ds.Tables[1].Rows[0][0].ToString()));
            	}

				
            	return ds;
								
		}
				
								
		public DataSet Selecionar(String Where, String OrderBy)
        {
            DAO_DATABASE db = new DAO_DATABASE();
            DataSet ds = new DataSet();
            StringBuilder sb = new StringBuilder();

                        sb.Append("SELECT     tb_produto.id, tb_produto.id_marca, tb_produto.id_grupo, tb_produto.id_categoria, tb_produto.id_ncm, tb_produto.extipi, tb_produto.cfop, tb_produto.id_genero_produto_servico, ");
            sb.Append("                       tb_produto.id_tipo_item, tb_produto.id_tipo_producao, tb_produto.ean, tb_produto.descricao, tb_produto.qtd_inicial, ");
            sb.Append("                      tb_produto.valor_promocao, tb_produto.valor_custo, tb_produto.valor_margem_lucro, tb_produto.valor_venda, tb_produto.valor_custo_medio, ");
            sb.Append(" tb_produto.id_unidade_medida, tb_produto.id_estoque_local, tb_produto.id_servico_issqn, tb_produto.dt_cadastro, tb_produto.sit_ativo, tb_produto.sit_mov_estoque, ");
            sb.Append(" tb_produto.id_usuario_checkin, tb_produto.dt_checkin, tb_tipo_item.desc_tipo_item, tb_tipo_producao.desc_tipo_producao, tb_produto_marca.marca, ");
            sb.Append(" tb_produto_categoria.categoria, tb_produto_detalhe.peso_bruto, tb_produto_detalhe.peso_liquido, tb_produto_detalhe.largura, tb_produto_detalhe.altura, ");
            sb.Append(" tb_produto_detalhe.profundidade, tb_produto_detalhe.volume, tb_produto_detalhe.id_cor, tb_produto_detalhe.id_tipo_compartimento, tb_ncm.desc_ncm, ");
            sb.Append(" tb_ncm.unidade_medida, (SELECT  ISNULL(SUM(qtd_entrada) - SUM(qtd_saida),0) FROM tb_estoque_movimento as e where e.id_produto = tb_produto.id) as qtd_estoque");
            sb.Append(" FROM         tb_produto INNER JOIN ");
            sb.Append("           tb_produto_categoria ON tb_produto.id_categoria = tb_produto_categoria.id LEFT JOIN");
            sb.Append(" tb_produto_detalhe ON tb_produto.id = tb_produto_detalhe.id_produto INNER JOIN");
            sb.Append(" tb_produto_marca ON tb_produto.id_marca = tb_produto_marca.id INNER JOIN");
            sb.Append(" tb_tipo_item ON tb_produto.id_tipo_item = tb_tipo_item.id INNER JOIN");
            sb.Append(" tb_tipo_producao ON tb_produto.id_tipo_producao = tb_tipo_producao.id INNER JOIN");
            sb.Append(" tb_ncm ON tb_produto.id_ncm = tb_ncm.id");

           if (Where != string.Empty)
            {
                db.CreateParameter("@Where", SqlDbType.VarChar, Where);
                sb.Append(string.Format(" Where  {0}",Where));
            }

            if (OrderBy != string.Empty)
            {
                db.CreateParameter("@OrderBy", SqlDbType.VarChar, OrderBy);
                sb.Append(string.Format(" Order By {0}", OrderBy));
            }

            ds = db.ExecuteQuery(sb.ToString());
            return ds;
        }		
		
		public DataSet Selecionar()
        {
            DAO_DATABASE db = new DAO_DATABASE();
            DataSet ds = new DataSet();
            StringBuilder sb = new StringBuilder();

            sb.Append("SELECT     tb_produto.id, tb_produto.id_marca, tb_produto.id_grupo, tb_produto.id_categoria, tb_produto.id_ncm, tb_produto.extipi, tb_produto.cfop, tb_produto.id_genero_produto_servico, ");
            sb.Append("                       tb_produto.id_tipo_item, tb_produto.id_tipo_producao, tb_produto.ean, tb_produto.descricao, tb_produto.qtd_inicial, ");
            sb.Append("                      tb_produto.valor_promocao, tb_produto.valor_custo, tb_produto.valor_margem_lucro, tb_produto.valor_venda, tb_produto.valor_custo_medio, ");
            sb.Append(" tb_produto.id_unidade_medida, tb_produto.id_estoque_local, tb_produto.id_servico_issqn, tb_produto.dt_cadastro, tb_produto.sit_ativo, tb_produto.sit_mov_estoque, ");
            sb.Append(" tb_produto.id_usuario_checkin, tb_produto.dt_checkin, tb_tipo_item.desc_tipo_item, tb_tipo_producao.desc_tipo_producao, tb_produto_marca.marca, ");
            sb.Append(" tb_produto_categoria.categoria, tb_produto_detalhe.peso_bruto, tb_produto_detalhe.peso_liquido, tb_produto_detalhe.largura, tb_produto_detalhe.altura, ");
            sb.Append(" tb_produto_detalhe.profundidade, tb_produto_detalhe.volume, tb_produto_detalhe.id_cor, tb_produto_detalhe.id_tipo_compartimento, tb_ncm.desc_ncm, ");
            sb.Append(" tb_ncm.unidade_medida, (SELECT  ISNULL(SUM(qtd_entrada) - SUM(qtd_saida),0) FROM tb_estoque_movimento as e where e.id_produto = tb_produto.id) as qtd_estoque");
            sb.Append(" FROM         tb_produto INNER JOIN ");
            sb.Append("           tb_produto_categoria ON tb_produto.id_categoria = tb_produto_categoria.id LEFT JOIN");
            sb.Append(" tb_produto_detalhe ON tb_produto.id = tb_produto_detalhe.id_produto INNER JOIN");
            sb.Append(" tb_produto_marca ON tb_produto.id_marca = tb_produto_marca.id INNER JOIN");
            sb.Append(" tb_tipo_item ON tb_produto.id_tipo_item = tb_tipo_item.id INNER JOIN");
            sb.Append(" tb_tipo_producao ON tb_produto.id_tipo_producao = tb_tipo_producao.id INNER JOIN");
            sb.Append(" tb_ncm ON tb_produto.id_ncm = tb_ncm.id");
          
            ds = db.ExecuteQuery(sb.ToString());
            return ds;
        }		
		
		
		public DataSet ListaCampos()
        {

            DAO_DATABASE db = new DAO_DATABASE();
            DataSet ds = new DataSet();
            StringBuilder sb = new StringBuilder();
            sb.Append("SELECT TABLE_NAME, ORDINAL_POSITION, ");
            sb.Append(" COLUMN_NAME, DATA_TYPE, IS_NULLABLE ");
            sb.Append(" FROM INFORMATION_SCHEMA.COLUMNS");
            sb.Append(" WHERE TABLE_NAME = 'tb_produto'");
            ds = db.ExecuteQuery(sb.ToString());

            return ds;

        }

		public DataSet DropdownList()
        {
            DAO_DATABASE db = new DAO_DATABASE();
            DataSet ds = new DataSet();
            StringBuilder sb = new StringBuilder();
			sb.Append("SELECT ");
			sb.Append(" id ");
				sb.Append(", id_marca ");  				
				sb.Append(", id_grupo ");  				
				sb.Append(", id_categoria ");  				
			sb.Append(" FROM tb_produto ");           
			sb.Append(" ORDER BY id_marca ");
            ds = db.ExecuteQuery(sb.ToString());

            // ds = db.ExecuteProcedure("USP_TB_PRODUTO_DROPDOWNLIST");  
            return ds;
        }

        public DataSet DropdownList(String Where)
        {
            DAO_DATABASE db = new DAO_DATABASE();
            DataSet ds = new DataSet();
            StringBuilder sb = new StringBuilder();
            db.CreateParameter("@Where", SqlDbType.VarChar, Where);
			sb.Append("SELECT ");
			sb.Append(" id ");
			
			
			sb.Append(", id_marca ");  				
			
			
			sb.Append(", id_grupo ");  				
			
			
			sb.Append(", id_categoria ");  				
			sb.Append(" FROM tb_produto ");
			sb.Append(string.Format(" WHERE {0} ",Where));
			sb.Append(" ORDER BY id_marca ");
            ds = db.ExecuteQuery(sb.ToString());

            // ds = db.ExecuteProcedure("USP_TB_PRODUTO_DROPDOWNLIST");
            return ds;
        }
		
		  public DataSet DropdownList(String Where, String OrderBy)
        {
            DAO_DATABASE db = new DAO_DATABASE();
            DataSet ds = new DataSet();
            StringBuilder sb = new StringBuilder();
            db.CreateParameter("@Where", SqlDbType.VarChar, Where);
			sb.Append("SELECT ");
			sb.Append(" id ");
			sb.Append(", id_marca ");  				
			sb.Append(", id_grupo ");  				
			sb.Append(", id_categoria ");  				
			sb.Append(" FROM tb_produto ");
			sb.Append(string.Format(" WHERE {0} ORDER BY {1}",Where,OrderBy));			
            ds = db.ExecuteQuery(sb.ToString());

            // ds = db.ExecuteProcedure("USP_TB_PRODUTO_DROPDOWNLIST");
            return ds;
        }

	}
	#endregion
}

